[iOS 8] NSURLSession で SPDY がサポートされました!
NSURLSession が SPDY をサポート
iOS 8 / OS X Yosemite より、NSURLSession で SPDY(スピーディ) プロトコルがサポートされました。 これまで SPDY プロトコルで通信するには CocoaSPDY などのような OSS を利用する必要がありましたが、iOS 8 / OS X Yosemite からは OS レベルでサポートされているため、Safari や UIWebView (または WKWebView) による通信処理でも SPDY プロトコルで通信できるようになりました。
ということで、下記サイトの「What's New in Foundation Networking」をベースに、iOS 8 / OS X Yosemite で 利用できる SPDY プロトコルについての基礎知識をまとめてみました。
https://developer.apple.com/videos/wwdc/2014/
SPDY とは?
さて、まず始めに SPDY とは何なのかおさらいしましょう。SPDY の概要について、Wikipedia から抜粋しました。
HTTPを拡張し高速化を目的としたプロトコルである。TLS接続の上にセッション層を追加し、単一のSPDYセッションで複数のリクエストを送受信する。さらに、ブラウザがページを表示する際、付随するデータの先読みを行う機能も追加している。セキュリティ機能も強化する。プロトコル的にはTLSの拡張仕様の一つであるApplication-Layer Protocol Negotiation(英語版) (ALPN) をベースにしているため、HTTPSを使っての通信が必須である。 2013年現在は、独立したプロトコルとして一部のWebブラウザやWebサーバで実装が進んでいるほか、IETFのドラフトも提出されており、標準化作業が進んでいる。
SPDY は Google が提唱した、現在標準化が進められている通信プロトコルの1つです。従来の HTTP 通信の問題点(無駄であり非効率な部分)を改善し、通信時間を短縮することが第一の目的として生み出されました *1。
SPDY は HTTP を完全に置き換え、全く新しい仕組みを提供するものではありません。SPDY は、HTTP のアプリケーションレイヤーと TCP トランスポートレイヤーの間に新しくセッションレイヤーを割り込ませて、データの送受信をコントロールする仕組みになっています(下図を参照)。そのため、既存の Web コンテンツやネットワーク構成などには影響しません。
このセッションレイヤーは、複数のリクエスト/レスポンスのやり取りが行える機能が提供されています。これにより、SPDY を使った通信では、単一の TCP 接続で複数のリクエスト/レスポンスのやり取りが可能です。
さらに大きな特徴として TLS (SSL) と組み合わせることで SPDY 非対応のクライアントに対しては HTTP を提供できる点が挙げられます *2。つまり、iOS アプリ用の API サーバーやスマホサイト用の Web サーバーを SPDY に対応した場合、iOS 8 未満のデバイスからでもそのまま通信が行えるということです。
SPDY の特徴をまとめると次のようになります。
- Web をより速くするための新しいプロトコル
- HTTP/2.0 ドラフト仕様のサーバーで動作
- 単一の TCP 接続で複数の HTTP メッセージの交換が可能
- TLS (SSL) と組み合わせることでプロトコルを自動選択 (SPDY or HTTP)
SPDY を体感してみよう
iOS 8 で初めて採用された SPDY ですが、真新しいプロトコルではありません。既に多くの Web サービス / Web サイトでも実用化されており、日常的に利用されています。
SPDY に対応しているブラウザ
SPDY に対応しているブラウザは次の通りです。
ブラウザ | 対応プロトコル | 備考 |
---|---|---|
Google Chrome | SPDY/2, SPDY/3, SPDY/3.1 | |
Mozilla FireFox | SPDY/2 (11以降), SPDY/3 (15以降), SPDY/3.1 (27以降) | 28 以降で SPDY/2 のサポート終了 |
Safari | SPDY/2, SPDY/3, SPDY/3.1 (いずれも8以降) | Mac OS X Yosemite または iOS 8 以降 |
Internet Explorer | SPDY/3 (11以降) | Windows 8.1 のみ (Windows 7 は未対応) |
Opera | SPDY/2, SPDY/3, SPDY/3.1 (いずれも12.10以降) | |
Android ブラウザ | SPDY/2, SPDY/3, SPDY/3.1 (いずれも3.0以降) |
Chrome の場合は、検索バーに「chrome://net-internals/#spdy」と打つと SPDY 通信を利用したセッションの一覧が確認できます。また、拡張機能「SPDY Indicator」をインストールすると SPDY 使用時に検索バーに稲妻マークが表示されるようになります。
SPDY に対応しているサイト
SPDY に対応しているサイトは、Google はもちろん、Twitter や Facebook などの大手も対応しています。
iOS 8 / OS X Yosemite で SPDY で通信するには
iOS 8 / OS X Yosemite と SPDY 通信するには SPDY/2, SPDY/3, SPDY/3.1 に準拠したサーバーである必要があります。また、NSURLSession で透過的にサポートされているため、クライアント側では特別な実装は必要ありません。
まとめ
モバイルデータ通信はとにかく速さを重視したいはずなので、iOS 8 が全面的にサポートしたということは非常に嬉しい限りです。これから作るサーバも、既存のサーバーも、ぜひ SPDY に対応させたいところですね。
参考
- iOS 8 では NSURLSession で透過的に SPDY をサポートするようになったようです (公開情報) | hirooka.pro
- SPDY: An experimental protocol for a faster web | The Chromium Projects
- Google提唱の新プロトコル「SPDY」とは--SPDYで変わること、変わらないこと | ZDNet Japan
- Web表示の高速化を実現するSPDYとHTTP/2.0の標準化 | IIJ